leetcode 977、984、989

因为这三个题目比较简单,所以就一起放上来了。

题目

  1. 有序数组的平方

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]

思路

这个挺简单的,就是从头开始求平方,然后插入进专门保存结果的vector里面。耗时之长,令人发指,看了别人排在前面的用时短的代码,

code

耗时最短。
class Solution {
static const int _ = []() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}();

class Solution {
public:
vector sortedSquares(vector& A) {
int size = A.size();

    if(size==1)
        return {A[0]*A[0]};

    vector<int> res(size,0);


    int pos = 0;

    while(A[pos]<0)
    {
        A[pos] = -A[pos];
        ++pos;    
    }
    int posForward = pos;
    int posBackward = pos-1;
    pos = 0;
    while(posForward<size && posBackward>=0)
    {
        if(A[posForward] > A[posBackward])
        {
            res[pos++] = A[posBackward]*A[posBackward];
            --posBackward;
        }
        else
        {
            res[pos++] = A[posForward]*A[posForward];
            ++posForward;                
        }

    }
    while(posForward<size)
    {
        res[pos++] = A[posForward]*A[posForward];
        ++posForward;     
    }
    while(posBackward>=0)
    {
        res[pos++] = A[posBackward]*A[posBackward];
        --posBackward;     
    }



    return res;


}
};
我的
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
    vector<int> res;
    res.push_back(A[0]*A[0]);
    int number=0;
    int flag=0;

    for(int i=1;i<A.size();i++)
    {
        flag=0;
        number=A[i]*A[i];

        for (int j=0;j<res.size();j++)
        {

            if (number<=res[j])
            {
                res.insert(res.begin()+j, number);
                flag=1;
                break;
            }
        }
        if(flag==0)
            res.push_back(number);
    }

    return res;

}
};

题目

  1. 不含 AAA 或 BBB 的字符串

给定两个整数 A 和 B,返回任意字符串 S,要求满足:
S 的长度为 A + B,且正好包含 A 个 ‘a’ 字母与 B 个 ‘b’ 字母;
子串 ‘aaa’ 没有出现在 S 中;
子串 ‘bbb’ 没有出现在 S 中。
示例 1:
输入:A = 1, B = 2
输出:”abb”
解释:”abb”, “bab” 和 “bba” 都是正确答案。

思路

感觉挺简单的,一看就懂了。

code

class Solution(object):
def strWithout3a3b(self, A, B):
    """
    :type A: int
    :type B: int
    :rtype: str
    """
    if A<3 and B<3:
        return A*'a'+B*'b'
    s=min(A,B)
    l=max(A,B)
    i=0
    res=''
    re=l-s-1
    sum1=A+B
    while(i<re):
        if (A>B):
            if(A>=2):
                res=res+'aa'
                A-=2
            if(B>=1):
                res=res+'b'
                B-=1
            i=i+1
            continue

        if(B>A):
            if(B>=2):
                res=res+'bb'
                B-=2
            if(A>=1):
                res=res+'a'
                A-=1
        i=i+1
    if(len(res)==(sum1)):
        return res
    while (A>0 and B>0):
        res=res+'ab'
        A=A-1
        B=B-1
    if (A>0 ):
        res=res+A*'a'


    if (B>0):
        res=res+B*'b'


    return res

题目

  1. 数组形式的整数加法
    对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
    给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
    示例 1:
    输入:A = [1,2,0,0], K = 34
    输出:[1,2,3,4]
    解释:1200 + 34 = 1234

    思路

    先翻转整个vector,然后进行加法,在结束后再对k的值检查,直到为零,最后再次反转。

code

class Solution {
public:
vector<int> addToArrayForm(vector<int>& A, int K) {
    int m=A.size();
    reverse(A.begin(),A.end());
    for(int i=0;i<m;i++)
    {
        K+=A[i];
        A[i]=K%10;
        K/=10;
    }
    while(K)
    {
        A.push_back(K%10);
        K/=10;
    }
    reverse(A.begin(),A.end());
    return A;

}

};